package ar.edu.utn.frba.tacs.warnes.entities;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Transient;

import org.apache.log4j.Logger;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

import ar.edu.utn.frba.tacs.warnes.dao.AutoDao;
import ar.edu.utn.frba.tacs.warnes.dao.BaseDaoImpl;

@Entity
public class Auto extends BaseEntityImpl {
	@Transient
	Logger log = Logger.getLogger(Auto.class);
	
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "AutoSeq")
	@SequenceGenerator(name = "AutoSeq", sequenceName = "AutoSeq")
	public long id;

	@OneToMany(mappedBy = "autoOrigen", fetch = FetchType.LAZY)
	@Cascade(value = { CascadeType.PERSIST })
	private List<Pieza> piezasDelAuto = new ArrayList<Pieza>();

	private String patente;
	private Integer modelo;
	private Date anio;
	private Date fechaDesguace;

	public long getId() {
		return this.id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public List<Pieza> getPiezasDelAuto() {
		return this.piezasDelAuto;
	}

	public void setPiezasDelAuto(List<Pieza> piezasDelAuto) {
		this.piezasDelAuto = piezasDelAuto;
	}

	public Auto(String patente) {
		this.setPatente(patente);
		this.log.debug("Se ha CREADO un nuevo AUTO con patente "+patente+".");
	}
	
	public Auto() {
		this.log.debug("Se ha CREADO un nuevo AUTO.");
	}
	
	public String getPatente() {
		return this.patente;
	}

	public void setPatente(String patente) {
		this.patente = patente;
	}

	public Integer getModelo() {
		return this.modelo;
	}

	public void setModelo(Integer anio) {
		this.modelo = anio;
	}

	public Date getAnio() {
		return this.anio;
	}

	public void setAnio(Date anio) {
		this.anio = anio;
	}

	public Date getFechaDesguace() {
		return this.fechaDesguace;
	}

	public void setFechaDesguace(Date fechaDesguace) {
		this.fechaDesguace = fechaDesguace;
	}

	public void borrarPieza(Pieza pieza) {
		this.getPiezasDelAuto().remove(pieza);
	}

	public void agregarPieza(Pieza pieza) {
		this.getPiezasDelAuto().add(pieza);
	}

	public Float getPorcentajePiezasVendidas() {
		int cantVendidas = 0;
		for (Pieza pieza : this.getPiezasDelAuto()) {
			if (pieza.estaVendida()) {
				cantVendidas++;
			}
		}
		return this.getPiezasDelAuto().isEmpty() ? new Float(0) : cantVendidas
				/ this.getCantidadPiezas();

	}

	public int getCantidadPiezas() {
		return this.getPiezasDelAuto().size();
	}

	public String toString() {
		return this.getPatente();
	}

	@Override
	public void delete() {
		BaseDaoImpl<Auto> dao = AutoDao.getInstance();
		dao.delete(this);
	}

	@Override
	public void save() {
		BaseDaoImpl<Auto> dao = AutoDao.getInstance();
		dao.save(this);
	}

	@SuppressWarnings("deprecation")
	public String getAnioFormateado() {
		return this.anio != null ? this.anio.getDate() + "-"
				+ this.anio.getMonth() + "-" + this.anio.getYear() : "";
	}

	@SuppressWarnings("deprecation")
	public String getFechaDesguaceFormateada() {
		return this.fechaDesguace != null ? this.fechaDesguace.getDate() + "-"
				+ this.fechaDesguace.getMonth() + "-"
				+ this.fechaDesguace.getYear() : "";
	}
}
